/**
 * 日志控制器，实现了新建日志控制器，获取日志控制，日志分类
 * 新建日志并输出日志 newLogger('xxxxx', './logs/xxxx.log').error("msg~");
 * 使用默认或新建过的日志getLogger(log.type.xxx).trace("msg~")；
 * type记录了默认的几种日志分类
 * ILogger 实现了几种日志的级别，私有的接口
 * @author yangxiao
 * @module lib/log
 */

import * as log4js from 'log4js';
import * as fs from 'fs';
import * as path from 'path';

export let _isInit = false;
export let _logConfig:any;

export function init(serverId,filePath:string = "asset/config/log4js.json"){

    if(!_isInit){
        let logJsonStr=fs.readFileSync(path.normalize(filePath),"utf-8"); 
        logJsonStr = logJsonStr.replace(/%s/g,serverId);
        _logConfig = JSON.parse(logJsonStr);
        log4js.configure(_logConfig);
        _isInit=true;
        console.log = trace;
    }

}

interface ILogger{
    trace(...agrs);
    debug(...agrs);
    info(...agrs);
    warn(...agrs);
    error(...agrs);
    fatal(...agrs);
}
/**
 * 日志记录类型
 */
export const type ={

    "rpcLog":"rpc-log",//输出 rpc filter 上的日志
    "forwardLog":"forward-log",//输出从前端服务器转发到后端服务器的请求日志
    "crashLog":"crash-log",//输出服务器crash异常时的日志信息
    "redisLog":"redis-log",//redis错误输出
    "adminLog":"admin-log",//输出用于监控client登陆master时输出的日志
    "console":"console",//控制台输出
}

/**
 * 建立一个新的日志控制器，以及新的文件地址
 * 使用示例：
 * newLogger('xxxxx', './logs/xxxx.log').error("2222");
 */
export function newLogger(categoryName:string,__fileName:string){
    if(log4js.hasLogger(categoryName)){
        console.warn('log.newLogger: exist '+__fileName);
        return getLogger(categoryName);
    }

    var loginfo = {
      "type": "file",
      "filename": __fileName,
      "maxLogSize": 1048576,
      "layout": {
        "type": "basic"
      },
      "backups": 5,
      "category": categoryName
    }

    _logConfig.appenders.push(loginfo);
    log4js.configure(_logConfig);
    return getLogger(categoryName);
}
/**
 * 获取日志控制器，只有error或fatal方法会被写入文件。请在服务启动中执行Init函数，设置服务器ID
 * 使用示例：
 * getLogger(log.categoryType.xxx).trace("msg~~")|debug()|info()|warn()|error()|fatal();
 * @param {String} categoryName相关使用可查看../config/log4js中文件
 */
export function getLogger(categoryName:string=''):ILogger{
    if(categoryName===''){
        categoryName = type.console;
    }
    return log4js.getLogger(categoryName);
}

/**
 *  替换原生，其实没什么乱用，为了以后统一修改某些设定或调试左右。console.log
 */
export function trace(...agrs){
    return getLogger().trace(...agrs);
}

/**
 *  替换原生，其实没什么乱用，为后续统一修改某些设定或调试。console.log
 */
export function error(...agrs){
    console.log(agrs);
    return getLogger(type.crashLog).error(...agrs);
}